package com.观察者模式.案列2.subject;

import com.观察者模式.案列2.dto.OmsDto;
import com.观察者模式.案列2.observer.ObserverInterface;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;

@Service
public class SubjectImpl implements Subject {

    /**
     * 所有的观察者集合
     */
    public  List<ObserverInterface> list=null;

    @Autowired
    ExecutorService newFixedThreadPool;


    public void setOmsDto(OmsDto omsDto){
        this.notifyObserver(omsDto);
    }

    @Override
    public void notifyObserver(OmsDto omsDto) {
        if (!CollectionUtils.isEmpty(list)){
            list.forEach(v->{
//                次数使用线程池，我们可以使用异步编程技术来实现，因为我们要是使用rabbitmq消息队列的话。要阻塞等待list中所有的请求执行完成才去ack
                newFixedThreadPool.execute(()->{
                    try {
                        v.update(omsDto);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                });

            });
        }
    }
}
